#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <assert.h>
#include <string.h>

//模拟实现memmove
//void* my_memmove(void* destination, const void* source, size_t num)
//{
//	assert(destination && source);
//	void* ret = destination;
//	if (destination<source)
//	{
//		while (num--)
//		{
//			*(char*)destination = *(char*)source;
//			((char*)destination)++;
//			((char*)source)++;
//		}
//	}
//	else
//	{
//		while (num--)
//		{
//			*((char*)destination + num) = *((char*)source + num);
//		}
//	}
//	return ret;
//}
//int main()
//{
//	int arr1[] = { 1,2,3,4,5,6,7,8,9,10 };
//	my_memmove(arr1+2, arr1, 20);
//	return 0;
//}


//int main()
//{
//	int arr1[] = {1,2,3,4,5,6,7,8,9,10};
//	memcpy(arr1,arr1+2,20);
//	return 0;
//}


//int main()
//{
//	int arr1[] = { 1,2,3 };
//	int arr2[] = {1,2,5};
//	printf("%d\n", memcmp(arr1, arr2, 8));
//}

//模拟实现memcmp
//int my_memcmp(const void* ptr1,const void* ptr2,size_t num)
//{
//	assert(ptr1&&ptr2);
//	while (num--)
//	{
//		if ((*(char*)ptr1)> (*(char*)ptr2))
//		{
//			return 1;
//		}
//		else if ((*(char*)ptr1) < (*(char*)ptr2))
//		{
//			return -1;
//		}
//		else
//		{
//			((char*)ptr1)++;
//			((char*)ptr2)++;
//		}
//	}
//	return 0;
//}
//int main()
//{
//	int arr1[] = {1,2,3};
//	int arr2[] = {1,2,2};
//	printf("%d\n", my_memcmp(arr1, arr2, 8));
//}

//memset
//int main()
//{
//	//char arr1[]="hello world";
//	//memset(arr1,'x',5);
//	//printf("%s\n",arr1);
//	//memset(arr1+6, 'y', 5);
//	//printf("%s\n", arr1);
//
//
//	int arr1[10] = {0};
//	memset(arr1,1,40);
//	return 0;
//}

//模拟实现memset
//void* my_memset(void* ptr1,int value,size_t num)
//{
//	void* ret = ptr1;
//	assert(ptr1);
//	while (num--)
//	{
//		*(char*)ptr1 = value;
//		((char*)ptr1)++;
//	}
//	return ret;
//}
//int main()
//{
//	char arr1[] = "hello world";
//	my_memset(arr1,'x',5);
//}



//作业标题(1445)
//模拟实现strlen
//
//作业内容
//模拟实现strlen

//size_t my_strlen(const char* string)
//{
//	assert(string);
//	size_t count = 0;
//	while (*string)
//	{
//		count++;
//		string++;
//	}
//	return count;
//}
//int main()
//{
//	char arr1[] = "qwertyu";
//	printf("%d\n", my_strlen(arr1));
//	return 0;
//}

//作业标题(1449)
//模拟实现strcpy
//
//作业内容
//模拟实现strcpy
//char* my_strcpy(char* destination,const char* source)
//{
//	char* ret = destination;
//	assert(destination&&source);
//	//while (*source)
//	//{
//	//	*destination = *source;
//	//	destination++;
//	//	source++;
//	//}
//	//*destination = '\0';
//	while (*destination++ = *source++)
//	{
//		;
//	}
//	return ret;
//
//}
//int main()
//{
//	char arr1[20] = "hello ";
//	char arr2[] = "world"; 
//	my_strcpy(arr1,arr2);
//	//strcpy(arr1,arr2);
//	return 0;
//}



//作业标题(1451)
//模拟实现strcmp
//
//作业内容
//模拟实现strcmp
//int my_strcmp(const char* string1,const char* string2)
//{
//	assert(string1&&string2);
//	//while (*string1&&*string2)
//	//{
//	//	if (*string1 > *string2)
//	//	{
//	//		return 1;
//	//	}
//	//	else if (*string1 < *string2)
//	//	{
//	//		return -1;
//	//	}
//	//	else
//	//	{
//	//		string1++;
//	//		string2++;
//	//	}
//	//}
//	//只有两个字符串完全相等时，才会return 0
//	while (*string1==*string2)
//	{
//		if (*string1=='\0')
//		{
//			return 0;
//		}
//		else
//		{
//			string1++;
//			string2++;
//		}
//	}
//	if (*string1>*string2)
//	{
//		return 1;
//	}
//	else
//	{
//		return -1;
//	}
//	
//
//}
//int main()
//{
//	char arr1[] = "a";
//	char arr2[] = "abc";
//	//printf("%d\n", strcmp(arr1, arr2)); 
//	printf("%d\n", my_strcmp(arr1, arr2));
//	return 0;
//}



//作业标题(1456)
//模拟实现strcat
//
//作业内容
//模拟实现strcat
//char* my_strcat(char* destination,const char* source)
//{
//	assert(destination&&source);
//	char* ret = destination;
//	while (*destination)
//	{
//		destination++;
//	}
//	//while (*source)
//	//{
//	//	*destination = *source;
//	//	destination++;
//	//	source++;
//	//}
//	while (*destination++ = *source++)
//	{
//		;
//	}
//	return ret;
//}
//int main()
//{
//	char arr1[30] = "hello ";
//	char arr2[] = "world";
//	my_strcat(arr1, arr2);
//	return 0;
//}



//作业标题(1458)
//模拟实现strstr
//
//作业内容
//模拟实现strstr
char* my_strstr(char* string1,char* string2)
{
	assert(string1&&string2);

	//首先排除一个特殊的情况
	if (*string2=='\0')
	{
		return string1;
	}
	//考虑一次循环过程，需要两个临时指针s1,s2来随时控制在两个字符串中的位置
	//一个指针cp，来记录在循环过程中指向s1中某个字符的位置
	char* s1 = NULL;
	char* s2 = NULL;
	char* cp = string1;
	while (*cp)
	{
		s1 = cp;
		s2 = string2;
		while (*s1 == *s2)
		{
			s1++;
			s2++;
		}
		if (*s2 == '\0')
		{
			return cp;
		}
		cp++;
	}
	return NULL;
	
}
int main()
{
	char arr1[] = "abcdefgh";
	printf("%s\n", my_strstr(arr1, "fg"));
	return 0;
}